package com.whxd.smarthome.api.v1.dh.ws;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

import org.apache.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hsview.client.HsviewClient;
import com.hsview.client.api.civil.device.BindDevice;
import com.hsview.client.api.civil.device.DeleteDeviceShare;
import com.hsview.client.api.civil.device.GetDeviceShare;
import com.hsview.client.api.civil.device.SetDeviceShare;
import com.hsview.client.api.civil.device.SetDeviceShare.RequestData.ShareInfosElement;
import com.hsview.client.api.civil.device.UnbindDevice;
import com.hsview.client.api.civil.open.GetDevices;
import com.hsview.client.api.civil.open.GetRealplayUrl;
import com.whxd.smarthome.Config;
import com.whxd.smarthome.api.v1.dh.ws.dto.BindDeviceDto;
import com.whxd.smarthome.api.v1.dh.ws.dto.DeleteDeviceShareDto;
import com.whxd.smarthome.api.v1.dh.ws.dto.GetDeviceShareDto;
import com.whxd.smarthome.api.v1.dh.ws.dto.GetDevicesDto;
import com.whxd.smarthome.api.v1.dh.ws.dto.GetRealplayUrlDto;
import com.whxd.smarthome.api.v1.dh.ws.dto.SetDeviceShareDto;
import com.whxd.smarthome.api.v1.dh.ws.dto.ShareInfoDto;
import com.whxd.smarthome.api.v1.dh.ws.dto.UnbindDeviceDto;
import com.whxd.smarthome.util.MediaTypes;

@Path("/v1/dh/device")
public class DeviceJaxRsService {

	private static Logger logger = LoggerFactory.getLogger(DeviceJaxRsService.class);
	private static ObjectMapper mapper = new ObjectMapper();

//	@POST
//	@Path("/BindDevice")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public Response BindDevice(BindDeviceDto dto) {
//		try {
//			logger.info("BindDevice data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		BindDevice req = new BindDevice();
//		req.data.deviceId = dto.getDeviceId();
//		req.data.deviceKey = dto.getDeviceKey();
//		req.data.gpsInfo.latitude = dto.getLatitude();
//		req.data.gpsInfo.longitude = dto.getLongitude();
//
//		BindDevice.Response resp = (BindDevice.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("BindDevice " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("BindDevice Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}
//
//	@POST
//	@Path("/SetDeviceShare")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public static Response SetDeviceShare(SetDeviceShareDto dto) {
//		try {
//			logger.info("SetDeviceShare data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		SetDeviceShare req = new SetDeviceShare();
//		req.data.deviceId = dto.getDeviceId();
//		req.data.channelId = dto.getChannelId();
//		for (ShareInfoDto infoDto : dto.getShareInfos()) {
//			ShareInfosElement element = new ShareInfosElement();
//			element.username = infoDto.getUsername();
//			element.functions = infoDto.getFunctions();
//			element.activeTime = infoDto.getActiveTime();
//			element.operation = infoDto.getOperation();
//			req.data.shareInfos.add(element);
//		}
//
//		SetDeviceShare.Response resp = (SetDeviceShare.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("SetDeviceShare " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("SetDeviceShare Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//
//	}
//
//	@POST
//	@Path("/GetDeviceShare")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public static Response GetDeviceShare(GetDeviceShareDto dto) {
//		try {
//			logger.info("GetDeviceShare data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		GetDeviceShare req = new GetDeviceShare();
//		req.data.deviceId = dto.getDeviceId();
//		req.data.channelId = dto.getChannelId();
//
//		GetDeviceShare.Response resp = (GetDeviceShare.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("GetDeviceShare " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("GetDeviceShare Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}
//
//	@POST
//	@Path("/UnbindDevice")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public static Response UnbindDevice(UnbindDeviceDto dto) {
//		try {
//			logger.info("UnbindDevice data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		UnbindDevice req = new UnbindDevice();
//		req.data.deviceId = dto.getDeviceId();
//		req.data.deleteCloudRecords = dto.isDeleteCloudRecords();
//
//		UnbindDevice.Response resp = (UnbindDevice.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("UnbindDevice " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("UnbindDevice Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}
//
//	@POST
//	@Path("/DeleteDeviceShare")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public static Response DeleteDeviceShare(DeleteDeviceShareDto dto) {
//		try {
//			logger.info("DeleteDeviceShare data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		DeleteDeviceShare req = new DeleteDeviceShare();
//		req.data.deviceId = dto.getDeviceId();
//		req.data.channelId = dto.getChannelId();
//		req.data.username = dto.getUsername();
//
//		DeleteDeviceShare.Response resp = (DeleteDeviceShare.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("DeleteDeviceShare " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("DeleteDeviceShare Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}

//	@POST
//	@Path("/GetDevices")
//	@Produces(MediaTypes.JSON_UTF_8)
//	@Consumes(MediaTypes.JSON_UTF_8)
//	public static Response GetDevices(GetDevicesDto dto) {
//		try {
//			logger.info("GetDevices data:" + mapper.writeValueAsString(dto));
//		} catch (JsonProcessingException e) {
//			logger.warn(e.getMessage());
//		}
//
//		HsviewClient m_client = new HsviewClient();
//		m_client.setHost(Config.host);
//		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����
//
//		GetDevices req = new GetDevices();
//		req.data.accessToken = dto.getAccessToken();
//
//		GetDevices.Response resp = (GetDevices.Response) m_client.request(req, 30000);
//
//		if (resp != null) {
//			logger.info("GetDevices " + resp.getBody());
//			return Response.status(resp.getCode()).entity(resp.getBody()).build();
//		} else {
//			try {
//				logger.error("GetDevices Error req:" + mapper.writeValueAsString(dto));
//			} catch (JsonProcessingException e) {
//				logger.error(e.getMessage());
//			}
//			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
//		}
//	}

	@POST
	@Path("/GetRealplayUrl")
	@Produces(MediaTypes.JSON_UTF_8)
	@Consumes(MediaTypes.JSON_UTF_8)
	public static Response GetRealplayUrl(GetRealplayUrlDto dto) {
		try {
			logger.info("GetRealplayUrl data:" + mapper.writeValueAsString(dto));
		} catch (JsonProcessingException e) {
			logger.warn(e.getMessage());
		}

		HsviewClient m_client = new HsviewClient();
		m_client.setHost(Config.host);
		m_client.setAuth(Config.devUser, Config.devPassword); // �û���// ����

		GetRealplayUrl req = new GetRealplayUrl();
		req.data.accessToken = dto.getAccessToken();
		req.data.channelId = dto.getChannelId();
		req.data.deviceId = dto.getDeviceId();
		req.data.streamId = dto.getStreamId();

		GetRealplayUrl.Response resp = (GetRealplayUrl.Response) m_client.request(req, 30000);

		if (resp != null) {
			logger.info("GetRealplayUrl " + resp.getBody());
			return Response.status(resp.getCode()).entity(resp.getBody()).build();
		} else {
			try {
				logger.error("GetRealplayUrl Error req:" + mapper.writeValueAsString(dto));
			} catch (JsonProcessingException e) {
				logger.error(e.getMessage());
			}
			return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
		}
	}

}